package test4_15.demo03;

public class Bank {
    public static void main(String[] args) {
        ATM atm = new ATM(200);

        new Thread(() -> atm.deposit(100),"A").start();
        new Thread(() -> atm.withdraw(50),"B").start();
    }
}
/*
假设一个银行的ATM机，它可以允许用户存款也可以取款。
现在一个账户上有存款200元，用户A和用户B都拥有在这个账户上存款和取款的权利。
用户A将存入100元，而用户B将取出50元，那么最后账户的存款应是250元。实际操作过程如下：

1) 先进行A的存款操作：
	1)	得到账户的存款数额200，耗时2s。
	2)	将账户数额增加100，耗时忽略不计
	3)	将新生成的账户结果300返回到ATM机的服务器上，耗时2s
(2) 再进行B的取款操作：
	4)	得到增加后账户存款数额300，耗时2s。
	5)	判断取款额是否小于账户余额，若是，则将账户数额减少50，否则抛出异常信息，耗时忽略不计。
	6)	将新生成的账户结果250返回到ATM机的服务器上，耗时2s。
 */
class ATM{
    double balance = 0;
    double tmpBalance;

    public synchronized void deposit(double addBalance){
        try {
            tmpBalance = balance;
            Thread.sleep(2000);
            System.out.println("账户余额为："+tmpBalance);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        System.out.println("存入"+addBalance+"元");
        tmpBalance = tmpBalance + addBalance;

        try {
            balance = tmpBalance;
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName()+"存入后余额为："+balance);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    public synchronized void withdraw(double reduceBalance){
        try {
            tmpBalance = balance;
            Thread.sleep(2000);
            System.out.println("账户余额为："+tmpBalance);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        System.out.println("取出"+reduceBalance+"元");

        if (reduceBalance <= tmpBalance){
            tmpBalance = tmpBalance - reduceBalance;
            try {
                balance = tmpBalance;
                Thread.sleep(2000);
                System.out.println(Thread.currentThread().getName()+"取款后余额为："+balance);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }else {
            System.out.println("余额不足，取款失败");
        }
    }


    public ATM(double balance) {
        this.balance = balance;
    }

    public double getBalance() {
        return balance;
    }
}
